Add additional stats to track VHPT saturation
authordjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>
Fri, 16 Sep 2005 22:54:53 +0000 (16:54 -0600)
committerdjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>
Fri, 16 Sep 2005 22:54:53 +0000 (16:54 -0600)
xen/arch/ia64/xen/privop.c
xen/arch/ia64/xen/vhpt.c

index f648144e4b8165ceffff659cf0ba6f281a3016c2..1c13823d4f54681083ebd1585d5c5c28c93838d0 100644 (file)
@@ -1107,6 +1107,7 @@ int dump_privop_counts_to_user(char __user *ubuf, int len)
 #ifdef PRIVOP_ADDR_COUNT
        n += dump_privop_addrs(buf + n);
 #endif
+       n += dump_vhpt_stats(buf + n);
        n += dump_misc_stats(buf + n);
        if (len < TMPBUFLEN) return -1;
        if (__copy_to_user(ubuf,buf,n)) return -1;
@@ -1122,6 +1123,7 @@ int zero_privop_counts_to_user(char __user *ubuf, int len)
 #ifdef PRIVOP_ADDR_COUNT
        zero_privop_addrs();
 #endif
+       zero_vhpt_stats();
        zero_misc_stats();
        zero_reflect_counts();
        if (len < TMPBUFLEN) return -1;
index 0eca1abdf33c130e6c988d7fde72b00ecc77201b..1cf305f0a16da00eca0b4f53c773dfb5766db330 100644 (file)
@@ -149,3 +149,24 @@ void vhpt_init(void)
        vhpt_flush();
 }
 
+
+void zero_vhpt_stats(void)
+{
+       return;
+}
+
+int dump_vhpt_stats(char *buf)
+{
+       int i;
+       char *s = buf;
+       struct vhpt_lf_entry *v = (void *)VHPT_ADDR;
+       unsigned long vhpt_valid = 0, vhpt_chains = 0;
+
+       for (i = 0; i < VHPT_NUM_ENTRIES; i++, v++) {
+               if (!(v->ti_tag & INVALID_TI_TAG)) vhpt_valid++;
+               if (v->CChain) vhpt_chains++;
+       }
+       s += sprintf(s,"VHPT usage: %ld/%ld (%ld collision chains)\n",
+               vhpt_valid,VHPT_NUM_ENTRIES,vhpt_chains);
+       return s - buf;
+}